package com.hckjsec.common.utils;

import com.alibaba.fastjson.JSON;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Date: 2021-7-28 18:46
 * @Note: 枚举工具类 获取枚举中的参数等方法
 */
public class EnumUtil {

  /**
   * 功能描述: <br>
   * 〈通过Class对象反射获取到对象内的参数，并通过执行get方法的方式获取到枚举对象内的参数值〉
   * @MethodName: enum2List
   * @Params: Class cls
   * @return: List<Hashtable<String,String>>
   * @since: 1.0.0
   * @Date: 2021-7-28 21:22
   */
  public static List<Hashtable<String,String>> enum2List(Class cls){
    List<Hashtable<String,String>> resultMap = new ArrayList<Hashtable<String,String>>();
    Object[] objects = cls.getEnumConstants();
    //遍历枚举常量
    Arrays.asList(objects).forEach(enmu -> {
      Hashtable<String, String> enmuTab = new Hashtable<String,String>();
      //遍历所有方法
      Arrays.asList(cls.getMethods()).forEach(mtd -> {
        // 判断方法的返回类型为String，再过滤到toString 方法
        if(!mtd.getName().equals("toString") && mtd.getAnnotatedReturnType().getType() == String.class) {
          try {
            // 把方法名转小写并当作key来使用
            String key  = mtd.getName().toLowerCase().replace("get","");
            enmuTab.put(key,String.valueOf(mtd.invoke(enmu)));
          } catch (IllegalAccessException e) {
            e.printStackTrace();
          } catch (InvocationTargetException e) {
            e.printStackTrace();
          }
        }
      });
      resultMap.add(enmuTab);
    });
    return resultMap;
  }



  /**
   * 功能描述: <br>
   * 〈通过Class对象反射获取到对象内的参数，并通过执行get方法的方式获取到枚举对象内的参数值〉
   * @MethodName: enum2List
   * @Params: Class cls
   * @return: List<Hashtable<String,String>>
   * @since: 1.0.0
   * @Date: 2021-7-28 21:22
   */
  public static Hashtable<String,Hashtable<String,String>> enum2HT(Class cls,String keyN){
    Hashtable<String,Hashtable<String,String>> resultMap = new Hashtable<String,Hashtable<String,String>>();
    Object[] objects = cls.getEnumConstants();
    //遍历枚举常量
    Arrays.asList(objects).forEach(enmu -> {
      Hashtable<String, String> enmuTab = new Hashtable<String,String>();
      AtomicReference<String> tempKey = new AtomicReference<>();
      //遍历所有方法
      Arrays.asList(cls.getMethods()).forEach(mtd -> {
        // 判断方法的返回类型为String，再过滤到toString 方法
        if(!mtd.getName().equals("toString") && mtd.getAnnotatedReturnType().getType() == String.class) {
          try {
            // 把方法名转小写并当作key来使用
            String key  = mtd.getName().toLowerCase().replace("get","");
            if(keyN.equals(key)) {
              tempKey.set(String.valueOf(mtd.invoke(enmu)));
            }
            enmuTab.put(key,String.valueOf(mtd.invoke(enmu)));
          } catch (IllegalAccessException e) {
            e.printStackTrace();
          } catch (InvocationTargetException e) {
            e.printStackTrace();
          }
        }
      });
      resultMap.put(tempKey.get(),enmuTab);
    });
    return resultMap;
  }
}
